import numpy as np
from gnuradio import filter
import matplotlib.pyplot as plt

def rrc_filter():
    # 生成BPSK符号
    bpsk_symbols = np.array([-1, 1,-1], dtype=np.complex64)

    # 创建滤波器
    rrc_taps = filter.firdes.root_raised_cosine(1.0, 4, 1.0, 0.35, 41)
    rrc_filter = filter.interp_fir_filter_ccf(4, rrc_taps)

    # 滤波处理
    output = np.convolve(np.repeat(bpsk_symbols, 4), rrc_taps, mode='full')

    print("最大幅度:", np.max(np.abs(output)))  # 输出应接近1.0

    plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
    plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
    plt.figure(figsize=(10, 4))
    plt.plot(np.real(output), label='实部')
    plt.plot(np.imag(output), '--', label='虚部（理论应接近0）')
    plt.axhline(y=1.0, color='r', linestyle=':', label='理论最大值')
    plt.title('BPSK符号经RRC滤波后的波形')
    plt.xlabel('采样点')
    plt.ylabel('幅度')
    plt.legend()
    plt.grid()
    plt.show()

if __name__=="__main__":
    rrc_filter()